
program transporter
 use modutils
 use modpop
 use modjed
 use modinip
 use modsystem
 use ifport
 implicit none


! -----------------------------------------------
! Deklaracje zmiennych i tablic
! -----------------------------------------------
 integer,parameter :: nx            = 201;
 integer,parameter :: ny            = 21;
 integer,parameter :: liczba_zrodel = 2;
 double precision,parameter :: dx   = 2;
 doubleprecision, allocatable , dimension(:,:,:) :: ave_PHI
 integer,parameter :: no_components = 1
 integer           :: i,j,ave_iter,no_ave_iter
 double precision  :: aveT
! -----------------------------------------------
! Zmienne wczytywane z config.ini
! -----------------------------------------------

allocate(ave_PHI(nx,ny,no_components))
call srand(INT(get_clock()))
call setIniFilename("config.ini")
call getDoubleValue("Dane","m_eff",M_EFF)
call getDoubleValue("Dane","eps",E_MAT)
call getDoubleValue("Dane","g_lan",G_LAN)
call getDoubleValue("Dane","Ef",atomic_Ef)
call getDoubleValue("Dane","Bz",atomic_Bz)


call modjed_ustaw_konwersje_jednostek(M_EFF,E_MAT);
call system_inicjalizacja(NX,NY,liczba_zrodel,DX,no_components);
UTOTAL = 0

call zrodla(1)%zrodlo_ustaw(1,NY,1,dx,atomic_Ef,atomic_Bz,ZRODLO_KIERUNEK_PRAWO,2,UTOTAL)
call zrodla(2)%zrodlo_ustaw(1,NY,NX,dx,atomic_Ef,atomic_Bz,ZRODLO_KIERUNEK_LEWO,2,UTOTAL)
call utworz_system()

!open(unit = 333, file= "T.txt" )
!do atomic_Ef = 15,50,0.5

    call zrodla(1)%zrodlo_ustaw(1,NY,1,dx,atomic_Ef,atomic_Bz,ZRODLO_KIERUNEK_PRAWO,2,UTOTAL)
    call zrodla(2)%zrodlo_ustaw(1,NY,NX,dx,atomic_Ef,atomic_Bz,ZRODLO_KIERUNEK_LEWO,2,UTOTAL)
    call utworz_system()
    ave_PHI = 0
    aveT    = 0
    no_ave_iter = 100
    do ave_iter = 1  , no_ave_iter
        call system_rozwiaz_problem(1)
        ave_PHI = ave_PHI + abs(PHI)**2
        aveT = aveT + TRANS_T
    enddo

!    write(333,"(100e20.8)"),atomic_Ef,aveT/no_ave_iter
!enddo
!close(333)

open(unit = 333, file= "ave_phi.txt" )
do i = 1 , nx
do j = 1 , ny
    write(333,"(20e20.8)"), i*dx , j*dx ,sum(ave_PHI(i,j,:))/no_ave_iter , ave_PHI(i,j,:)/no_ave_iter
enddo
    write(333,*),""
enddo
close(333)

!call system_zapisz_do_pliku("flagi.txt" ,ZAPISZ_FLAGI    );
call system_zapisz_do_pliku("phi.txt"   ,ZAPISZ_PHI      );
call system_zapisz_do_pliku("wkl.txt"   ,ZAPISZ_WKL      );
call system_zapisz_do_pliku("utotal.txt",ZAPISZ_POTENCJAL);
call system_zwalnienie_pamieci()

contains

subroutine utworz_system()
    integer :: i,j , wjazd , promien
    ! prosty test
    wjazd = 5

    UTOTAL(NX/2-20,:) =  10/1000.0/Rd
    UTOTAL(NX/2+20,:) =  10/1000.0/Rd



    ! dajemy na brzegach dirichleta
    GFLAGS(1,:)  = B_DIRICHLET
    GFLAGS(NX,:) = B_DIRICHLET
    GFLAGS(:,1)  = B_DIRICHLET
    GFLAGS(:,NY) = B_DIRICHLET
    call system_inicjalizacja_ukladu(wjazd,0,0)
end subroutine utworz_system


end program transporter

